/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import entities.Almacen;
import entities.C;
import entities.Cliente;
import entities.Configuracion;
import entities.D;
import entities.DescuentoCliente;
import entities.EstadoPedido;
import entities.EtapaProducto;
import entities.FormaPago;
import entities.MultiplicadorProductoPedido;
import entities.NivelPrecio;
import entities.Pais;
import entities.PeticionTraspasoMercancia;
import entities.ProductoTalla;
import entities.Proveedor;
import entities.Resto;
import entities.S;
import entities.SerieTallaje;
import entities.Sexo;
import entities.Temporada;
import entities.Tienda;
import entities.TipoAlmacen;
import entities.TipoCliente;
import facades.AlmacenFacade;
import facades.CFacade;
import facades.ClienteFacade;
import facades.ConfiguracionFacade;
import facades.DFacade;
import facades.DescuentoClienteFacade;
import facades.EstadoPedidoFacade;
import facades.EtapaProductoFacade;
import facades.FormaPagoFacade;
import facades.MultiplicadorProductoPedidoFacade;
import facades.NivelPrecioFacade;
import facades.PaisFacade;
import facades.PedidoFacade;
import facades.PeticionTraspasoMercanciaFacade;
import facades.ProductoTallaFacade;
import facades.ProveedorFacade;
import facades.RestoFacade;
import facades.SFacade;
import facades.SerieTallajeFacade;
import facades.SexoFacade;
import facades.TemporadaFacade;
import facades.TiendaFacade;
import facades.TipoAlmacenFacade;
import facades.TipoClienteFacade;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import org.apache.commons.collections.map.MultiKeyMap;
import qualifiers.ConfiguracionActual;
import qualifiers.EventoEntidadCreada;
import qualifiers.Recurso;
import qualifiers.resources.MapaProductosTalla;
import qualifiers.resources.MultiplicadoresCategoriasYSexos;
import qualifiers.resources.MultiplicadoresCategoriasYSexosMap;
import qualifiers.resources.MultiplicadoresProductosYPedidos;
import qualifiers.resources.MultplicadoresProductosYPedidosMap;
import qualifiers.resources.NivelPrecioNormal;
import ventas.qualifiers.EventoBorrarMultiplicadorCategoriaYSexo;
import ventas.qualifiers.EventoBorrarMultiplicadorProductoYPedido;
import ventas.qualifiers.EventoNuevoMultiplicadorCategoriaYSexo;
import ventas.qualifiers.EventoNuevoMultiplicadorProductoYPedido;

/**
 *
 * @author damfercer
 */
@Named(value = "resourcesBean")
@ApplicationScoped
public class ResourcesBean {
    private Configuracion configuracion;
    private NivelPrecio nivelPrecioNormal;
    private List<Temporada> temporadas;
    private Temporada[] temporadaArray;
    private List<C> cs;
    private List<D> ds;
    private List<S> ss;
    private List<Sexo> sexos;
    private List<SerieTallaje> seriesTallaje;
    private List<Proveedor> proveedores;
    private List<EtapaProducto> etapas;
    private List<Cliente> clientes;
    private List<FormaPago> formasPago;
    private List<Resto> restos;
    private List<EstadoPedido> estadosPedido;
    private List<Pais> paises;
    private List<NivelPrecio> nivelesPrecio;
    private List<TipoAlmacen> tiposAlmacen;
    private List<Tienda> tiendas;
    private List<Almacen> almacenes;
    private List<TipoCliente> tiposCliente;
    private List<PeticionTraspasoMercancia> peticionesTraspasoMercancia;
    private List<DescuentoCliente> descuentosCliente;
    private MultiKeyMap multiplicadoresCategoriaYSexoMap;
    private MultiKeyMap multiplicadoresProductoYPedidoMap;
    private List<MultiplicadorProductoPedido> multiplicadoresCategoriaYSexo;
    private List<MultiplicadorProductoPedido> multiplicadoresProductoYPedido;
    private MultiKeyMap productosTallaMap;
    private Pais spain;
    private TipoCliente tipoClienteParticular;
    @Inject
    private TemporadaFacade temporadaFacade;
    @Inject
    private CFacade cFacade;
    @Inject
    private DFacade dFacade;
    @Inject
    private SFacade sFacade;
    @Inject
    private SexoFacade sexoFacade;
    @Inject
    private SerieTallajeFacade serieTallajeFacade;
    @Inject
    private ProveedorFacade proveedorFacade;
    @Inject
    private EtapaProductoFacade etapaProductoFacade;
    @Inject
    private ConfiguracionFacade configuracionFacade;
    @Inject
    private PedidoFacade pedidoFacade;
    @Inject
    private ClienteFacade clienteFacade;
    @Inject
    private FormaPagoFacade formaPagoFacade;
    @Inject
    private RestoFacade restoFacade;
    @Inject
    private EstadoPedidoFacade estadoPedidoFacade;
    @Inject
    private PaisFacade paisFacade;
    @Inject
    private MultiplicadorProductoPedidoFacade multiplicadoresFacade;
    @Inject
    private ProductoTallaFacade productoTallaFacade;
    @Inject
    private NivelPrecioFacade nivelPrecioFacade;
    @Inject
    private TipoAlmacenFacade tipoAlmacenFacade;
    @Inject
    private TiendaFacade tiendaFacade;
    @Inject
    private AlmacenFacade almacenFacade;
    @Inject
    private PeticionTraspasoMercanciaFacade peticionTraspasoMercanciaFacade;
    @Inject
    private TipoClienteFacade tipoClienteFacade;
    @Inject
    private DescuentoClienteFacade descuentoClienteFacade;
    
    /**
     * Creates a new instance of ResourcesBean
     */
    public ResourcesBean() {
    }
    
    @PostConstruct
    public void init(){
        this.temporadas=temporadaFacade.findAll();
        this.ds=dFacade.findAll();
        this.cs=cFacade.findAll();
        this.ss=sFacade.findAll();
        this.sexos=sexoFacade.findAll();
        this.seriesTallaje=serieTallajeFacade.findAll();
        this.proveedores=proveedorFacade.findAll();
        this.etapas=etapaProductoFacade.findAll();
        this.estadosPedido=estadoPedidoFacade.findAll();
        this.configuracion=configuracionFacade.find(1);
        this.clientes=clienteFacade.findAll();
        this.restos=restoFacade.findAll();
        this.formasPago=formaPagoFacade.findAll();
        this.paises=paisFacade.findAll();
        this.nivelesPrecio=nivelPrecioFacade.findAll();
        this.descuentosCliente=descuentoClienteFacade.findAll();
        this.setMultiplicadoresCategoriaYSexo(multiplicadoresFacade.getTodosMultiplicadoresDeCategoriaYSexo());
        this.setMultiplicadoresProductoYPedido(multiplicadoresFacade.getTodosMultiplicadoresDeProductoYPedido());
        inicializarMultiplicadoresCategoriasYSexos();
        inicializarMultiplicadoresProductosYPedidos();
        inicializarProductosTallas();
        nivelPrecioNormal=nivelPrecioFacade.find(1);
        tiposAlmacen=tipoAlmacenFacade.findAll();
        tiendas=tiendaFacade.findAll();
        almacenes=almacenFacade.findAll();
        peticionesTraspasoMercancia=peticionTraspasoMercanciaFacade.findAll();
        tiposCliente=tipoClienteFacade.findAll();
        this.spain=paisFacade.getSpain();
        this.tipoClienteParticular=tipoClienteFacade.getTipoClienteParticular();
        Collections.sort(cs);
        Collections.sort(ds);
        Collections.sort(ss);
    }
    
    private void inicializarProductosTallas(){
        List<ProductoTalla> productosTalla=productoTallaFacade.findAll();
        if(productosTalla!=null){
            productosTallaMap=new MultiKeyMap();
            for(ProductoTalla productoTalla: productosTalla){
                productosTallaMap.put(productoTalla.getProducto().getIdProducto(), productoTalla.getTalla().getIdTalla(), productoTalla);
            }
        }
        
    }
    
    private void inicializarMultiplicadoresProductosYPedidos(){
        List<MultiplicadorProductoPedido> multiplicadores=multiplicadoresFacade.getTodosMultiplicadoresDeProductoYPedido();
        if(multiplicadores!=null){
            setMultiplicadoresProductoYPedidoMap(new MultiKeyMap());
            for (MultiplicadorProductoPedido multiplicadorProductoPedido : multiplicadores) {
                getMultiplicadoresProductoYPedidoMap().put(multiplicadorProductoPedido.getProducto().getIdProducto(), multiplicadorProductoPedido.getPedido().getIdPedido(), multiplicadorProductoPedido);
            }
        }
    }
    
    private void inicializarMultiplicadoresCategoriasYSexos(){
        List<MultiplicadorProductoPedido> multiplicadores=multiplicadoresFacade.getTodosMultiplicadoresDeCategoriaYSexo();
        if(multiplicadores!=null){
            setMultiplicadoresCategoriaYSexoMap(new MultiKeyMap());
            for (MultiplicadorProductoPedido multiplicadorCategoriaYSexo : multiplicadores) {
                getMultiplicadoresCategoriaYSexoMap().put(multiplicadorCategoriaYSexo.getCategoria().getIdC(), multiplicadorCategoriaYSexo.getSexo().getIdSexo(), multiplicadorCategoriaYSexo);
            }
        }
    }

    /**
     * @return the temporadas
     */
    @Produces
    @Recurso
    public List<Temporada> getTemporadas() {
        return temporadas;
    }

    /**
     * @param temporadas the temporadas to set
     */
    public void setTemporadas(List<Temporada> temporadas) {
        this.temporadas = temporadas;
    }

    /**
     * @return the cs
     */
    @Produces
    @Recurso
    public List<C> getCs() {
        return cs;
    }

    /**
     * @param cs the cs to set
     */
    public void setCs(List<C> cs) {
        this.cs = cs;
    }

    /**
     * @return the ds
     */
    @Produces
    @Recurso
    public List<D> getDs() {
        return ds;
    }

    /**
     * @param ds the ds to set
     */
    public void setDs(List<D> ds) {
        this.ds = ds;
    }

    /**
     * @return the ss
     */
    @Produces
    @Recurso
    public List<S> getSs() {
        return ss;
    }

    /**
     * @param ss the ss to set
     */
    public void setSs(List<S> ss) {
        this.ss = ss;
    }

    /**
     * @return the sexos
     */
    @Produces
    @Recurso
    public List<Sexo> getSexos() {
        return sexos;
    }

    /**
     * @param sexos the sexos to set
     */
    public void setSexos(List<Sexo> sexos) {
        this.sexos = sexos;
    }

    /**
     * @return the seriesTallaje
     */
    @Produces
    @Recurso
    public List<SerieTallaje> getSeriesTallaje() {
        return seriesTallaje;
    }

    /**
     * @param seriesTallaje the seriesTallaje to set
     */
    public void setSeriesTallaje(List<SerieTallaje> seriesTallaje) {
        this.seriesTallaje = seriesTallaje;
    }

    /**
     * @return the proveedores
     */
    @Produces
    @Recurso
    public List<Proveedor> getProveedores() {
        return proveedores;
    }

    /**
     * @param proveedores the proveedores to set
     */
    public void setProveedores(List<Proveedor> proveedores) {
        this.proveedores = proveedores;
    }

    /**
     * @return the etapas
     */
    @Produces
    @Recurso
    public List<EtapaProducto> getEtapas() {
        return etapas;
    }

    /**
     * @param etapas the etapas to set
     */
    public void setEtapas(List<EtapaProducto> etapas) {
        this.etapas = etapas;
    }

    /**
     * @return the temporada
     */
    public Temporada[] getTemporada() {
        return temporadaArray;
    }

    /**
     * @param temporada the temporada to set
     */
    public void setTemporada(Temporada[] temporada) {
        this.temporadaArray = temporada;
    }

    /**
     * @return the configuracion
     */
    @Produces 
    @ConfiguracionActual
    public Configuracion getConfiguracion() {
        return configuracion;
    }

    /**
     * @param configuracion the configuracion to set
     */
    public void setConfiguracion(Configuracion configuracion) {
        this.configuracion = configuracion;
    }
//    
//    /**
//     * @return the pedidos
//     */
//    public List<Pedido> getPedidos() {
//        return pedidos;
//    }
//
//    /**
//     * @param pedidos the pedidos to set
//     */
//    public void setPedidos(List<Pedido> pedidos) {
//        this.pedidos = pedidos;
//    }

    /**
     * @return the clientes
     */
    @Produces
    @Recurso
    public List<Cliente> getClientes() {
        return clientes;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    public void onNuevoCliente(@Observes @EventoEntidadCreada Cliente c){
        getClientes().add(c);
    }
    /**
     * @return the formasPago
     */
    @Produces
    @Recurso
    public List<FormaPago> getFormasPago() {
        return formasPago;
    }

    /**
     * @param formasPago the formasPago to set
     */
    public void setFormasPago(List<FormaPago> formasPago) {
        this.formasPago = formasPago;
    }

    /**
     * @return the restos
     */
    @Produces
    @Recurso
    public List<Resto> getRestos() {
        return restos;
    }

    /**
     * @param restos the restos to set
     */
    public void setRestos(List<Resto> restos) {
        this.restos = restos;
    }

    /**
     * @return the estadosPedido
     */
    @Produces
    @Recurso
    public List<EstadoPedido> getEstadosPedido() {
        return estadosPedido;
    }

    /**
     * @param estadosPedido the estadosPedido to set
     */
    public void setEstadosPedido(List<EstadoPedido> estadosPedido) {
        this.estadosPedido = estadosPedido;
    }

    /**
     * @return the paises
     */
    @Produces
    @Recurso
    public List<Pais> getPaises() {
        return paises;
    }

    /**
     * @param paises the paises to set
     */
    public void setPaises(List<Pais> paises) {
        this.paises = paises;
    }

    /**
     * @return the multiplicadoresCategoriaYSexo
     */
    @Produces
    @MultiplicadoresCategoriasYSexosMap
    public MultiKeyMap getMultiplicadoresCategoriaYSexoMap() {
        return multiplicadoresCategoriaYSexoMap;
    }

    /**
     * @param multiplicadoresCategoriaYSexo the multiplicadoresCategoriaYSexo to set
     */
    public void setMultiplicadoresCategoriaYSexoMap(MultiKeyMap multiplicadoresCategoriaYSexoMap) {
        this.multiplicadoresCategoriaYSexoMap = multiplicadoresCategoriaYSexoMap;
    }

    /**
     * @return the multiplicadoresProductoYPedido
     */
    @Produces
    @MultplicadoresProductosYPedidosMap
    public MultiKeyMap getMultiplicadoresProductoYPedidoMap() {
        return multiplicadoresProductoYPedidoMap;
    }

    /**
     * @param multiplicadoresProductoYPedido the multiplicadoresProductoYPedido to set
     */
    
    public void setMultiplicadoresProductoYPedidoMap(MultiKeyMap multiplicadoresProductoYPedidoMap) {
        this.multiplicadoresProductoYPedidoMap = multiplicadoresProductoYPedidoMap;
    }

    /**
     * @return the multiplicadoresCategoriaYSexo
     */
    @Produces
    @MultiplicadoresCategoriasYSexos
    public List<MultiplicadorProductoPedido> getMultiplicadoresCategoriaYSexo() {
        return multiplicadoresCategoriaYSexo;
    }

    /**
     * @param multiplicadoresCategoriaYSexo the multiplicadoresCategoriaYSexo to set
     */
    public void setMultiplicadoresCategoriaYSexo(List<MultiplicadorProductoPedido> multiplicadoresCategoriaYSexo) {
        this.multiplicadoresCategoriaYSexo = multiplicadoresCategoriaYSexo;
    }

    /**
     * @return the multiplicadoresProductoYPedido
     */

    @Produces
    @MultiplicadoresProductosYPedidos
    public List<MultiplicadorProductoPedido> getMultiplicadoresProductoYPedido() {
        return multiplicadoresProductoYPedido;
    }

    /**
     * @param multiplicadoresProductoYPedido the multiplicadoresProductoYPedido to set
     */
    public void setMultiplicadoresProductoYPedido(List<MultiplicadorProductoPedido> multiplicadoresProductoYPedido) {
        this.multiplicadoresProductoYPedido = multiplicadoresProductoYPedido;
    }
    
    public void onNuevoMultiplicadorCategoriaYSexo(@Observes @EventoNuevoMultiplicadorCategoriaYSexo MultiplicadorProductoPedido multiplicadorCategoriaYSexo){
        if(this.multiplicadoresCategoriaYSexo==null){
            this.multiplicadoresCategoriaYSexo=new ArrayList<MultiplicadorProductoPedido>();
        }
        if(this.multiplicadoresCategoriaYSexoMap==null){
            this.multiplicadoresCategoriaYSexoMap=new MultiKeyMap();
        }
        this.multiplicadoresCategoriaYSexo.add(multiplicadorCategoriaYSexo);
        getMultiplicadoresCategoriaYSexoMap().put(multiplicadorCategoriaYSexo.getCategoria().getIdC(), multiplicadorCategoriaYSexo.getSexo().getIdSexo(), multiplicadorCategoriaYSexo);
    }
    
    public void onBorradoMultiplicadorCategoriaYSexo(@Observes @EventoBorrarMultiplicadorCategoriaYSexo MultiplicadorProductoPedido multiplicadorCategoriaYSexo){
        this.multiplicadoresCategoriaYSexo.remove(multiplicadorCategoriaYSexo);
        getMultiplicadoresCategoriaYSexoMap().remove(multiplicadorCategoriaYSexo.getCategoria().getIdC(), multiplicadorCategoriaYSexo.getSexo().getIdSexo());
    }
    
    public void onNuevoMultiplicadorProductoYPedido(@Observes @EventoNuevoMultiplicadorProductoYPedido MultiplicadorProductoPedido multiplicadorProductoYPedido){
        if(this.multiplicadoresProductoYPedido==null){
            this.multiplicadoresProductoYPedido=new ArrayList<MultiplicadorProductoPedido>();
        }
        if(this.multiplicadoresProductoYPedidoMap==null){
            this.multiplicadoresProductoYPedidoMap=new MultiKeyMap();
        }
        this.multiplicadoresProductoYPedido.add(multiplicadorProductoYPedido);
        getMultiplicadoresProductoYPedidoMap().put(multiplicadorProductoYPedido.getProducto().getIdProducto(), multiplicadorProductoYPedido.getPedido().getIdPedido(), multiplicadorProductoYPedido);
    }
    
    public void onBorradoMultiplicadorProductoYPedido(@Observes @EventoBorrarMultiplicadorProductoYPedido MultiplicadorProductoPedido multiplicadorProductoYPedido){
        this.multiplicadoresProductoYPedido.remove(multiplicadorProductoYPedido);
        getMultiplicadoresProductoYPedidoMap().remove(multiplicadorProductoYPedido.getProducto().getIdProducto(), multiplicadorProductoYPedido.getPedido().getIdPedido());
    }

    public void onNuevoProductoTalla(@Observes @EventoEntidadCreada ProductoTalla pt){
        this.productosTallaMap.put(pt.getProducto().getIdProducto(), pt.getTalla().getIdTalla(), pt);
    }
    
    /**
     * @return the productosTallaMap
     */
    @Produces
    @MapaProductosTalla
    public MultiKeyMap getProductosTallaMap() {
        return productosTallaMap;
    }

    /**
     * @param productosTallaMap the productosTallaMap to set
     */
    public void setProductosTallaMap(MultiKeyMap productosTallaMap) {
        this.productosTallaMap = productosTallaMap;
    }

    /**
     * @return the nivelesPrecio
     */
    public List<NivelPrecio> getNivelesPrecio() {
        return nivelesPrecio;
    }

    /**
     * @param nivelesPrecio the nivelesPrecio to set
     */
    public void setNivelesPrecio(List<NivelPrecio> nivelesPrecio) {
        this.nivelesPrecio = nivelesPrecio;
    }

    /**
     * @return the nivelPrecioNormal
     */
    @Produces
    @NivelPrecioNormal
    public NivelPrecio getNivelPrecioNormal() {
        return nivelPrecioNormal;
    }

    /**
     * @param nivelPrecioNormal the nivelPrecioNormal to set
     */
    public void setNivelPrecioNormal(NivelPrecio nivelPrecioNormal) {
        this.nivelPrecioNormal = nivelPrecioNormal;
    }

    /**
     * @return the tiposAlmacen
     */
    @Produces
    @Recurso
    public List<TipoAlmacen> getTiposAlmacen() {
        return tiposAlmacen;
    }

    /**
     * @param tiposAlmacen the tiposAlmacen to set
     */
    public void setTiposAlmacen(List<TipoAlmacen> tiposAlmacen) {
        this.tiposAlmacen = tiposAlmacen;
    }

    /**
     * @return the tiendas
     */
    @Produces
    @Recurso
    public List<Tienda> getTiendas() {
        return tiendas;
    }

    /**
     * @param tiendas the tiendas to set
     */
    public void setTiendas(List<Tienda> tiendas) {
        this.tiendas = tiendas;
    }

    /**
     * @return the almacenes
     */
    @Produces
    @Recurso
    public List<Almacen> getAlmacenes() {
        return almacenes;
    }

    /**
     * @param almacenes the almacenes to set
     */
    public void setAlmacenes(List<Almacen> almacenes) {
        this.almacenes = almacenes;
    }
    
    public void onNuevoAlmacen(@Observes @EventoEntidadCreada Almacen almacen){
        almacenes.add(almacen);
    }

    /**
     * @return the peticionesTraspasoMercancia
     */
    @Produces
    @Recurso
    public List<PeticionTraspasoMercancia> getPeticionesTraspasoMercancia() {
        return peticionesTraspasoMercancia;
    }

    /**
     * @param peticionesTraspasoMercancia the peticionesTraspasoMercancia to set
     */
    public void setPeticionesTraspasoMercancia(List<PeticionTraspasoMercancia> peticionesTraspasoMercancia) {
        this.peticionesTraspasoMercancia = peticionesTraspasoMercancia;
    }
    
    /*public void onNuevoTraspasoMercancia(@Observes @EventoEntidadCreada PeticionTraspasoMercancia peticionTraspasoMercancia){
        if(peticionesTraspasoMercancia==null){
            peticionesTraspasoMercancia=new ArrayList<PeticionTraspasoMercancia>();
        }
        peticionesTraspasoMercancia.add(peticionTraspasoMercancia);
    }*/

    /**
     * @return the tiposCliente
     */
    public List<TipoCliente> getTiposCliente() {
        return tiposCliente;
    }

    /**
     * @param tiposCliente the tiposCliente to set
     */
    public void setTiposCliente(List<TipoCliente> tiposCliente) {
        this.tiposCliente = tiposCliente;
    }

    /**
     * @return the spain
     */
    public Pais getSpain() {
        return spain;
    }

    /**
     * @param spain the spain to set
     */
    public void setSpain(Pais spain) {
        this.spain = spain;
    }

    /**
     * @return the tipoClienteParticular
     */
    public TipoCliente getTipoClienteParticular() {
        return tipoClienteParticular;
    }

    /**
     * @param tipoClienteParticular the tipoClienteParticular to set
     */
    public void setTipoClienteParticular(TipoCliente tipoClienteParticular) {
        this.tipoClienteParticular = tipoClienteParticular;
    }

    /**
     * @return the descuentosCliente
     */
    public List<DescuentoCliente> getDescuentosCliente() {
        return descuentosCliente;
    }

    /**
     * @param descuentosCliente the descuentosCliente to set
     */
    public void setDescuentosCliente(List<DescuentoCliente> descuentosCliente) {
        this.descuentosCliente = descuentosCliente;
    }
}
